import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
import { menuData } from "@/data/menuData"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}

// 从菜单数据中提取路由配置
export interface MenuRoute {
  path: string;
  component: string;
  status: string;
}

/**
 * 从菜单数据中提取所有启用的路由配置
 * @param menuData 菜单数据
 * @returns 路由配置数组
 */
export function extractRoutesFromMenus(menuData: any[]): MenuRoute[] {
  const routes: MenuRoute[] = [];
  
  // 递归遍历菜单数据
  const traverseMenus = (menus: any[]) => {
    menus.forEach(menu => {
      // 如果是启用的菜单项且有路径，则添加到路由
      if (menu.status === 1 && menu.path && menu.type === 1) {
        routes.push({
          path: menu.path,
          component: menu.componentName || menu.name,
          status: menu.status
        });
      }
      
      // 递归处理子菜单
      if (menu.children && menu.children.length > 0) {
        traverseMenus(menu.children);
      }
    });
  };
  
  traverseMenus(menuData);
  return routes;
}

/**
 * 根据菜单数据动态生成组件映射
 * @param menuData 菜单数据
 * @returns 组件映射对象
 */
export function generateComponentMap(menuData: any[]): Record<string, string> {
  const componentMap: Record<string, string> = {};
  
  // 递归遍历菜单数据，提取路径到组件名称的映射
  const traverseMenus = (menus: any[]) => {
    menus.forEach(menu => {
      // 如果是启用的菜单项且有路径，则添加到映射
      if (menu.status === 1 && menu.path && menu.type === 1) {
        // 直接使用菜单数据中的componentName字段
        const componentName = menu.componentName;
        
        if (componentName) {
          // 处理路径冲突：如果路径已存在，使用系统ID作为前缀
          const systemPrefix = menu.parentId ? `${menu.parentId}_` : '';
          const uniquePath = systemPrefix + menu.path;
          
          componentMap[uniquePath] = componentName;
        }
      }
      
      // 递归处理子菜单
      if (menu.children && menu.children.length > 0) {
        traverseMenus(menu.children);
      }
    });
  };
  
  traverseMenus(menuData);
  return componentMap;
}

// 预先生成的组件映射（基于当前菜单数据）
const componentMap = generateComponentMap(menuData);

// 调试：输出组件映射以验证是否正确生成
console.log('生成的组件映射:', componentMap);

/**
 * 根据路径获取对应的组件名称
 * @param path 路径
 * @returns 组件名称
 */
export function getComponentNameByPath(path: string): string {
  // 首先尝试直接匹配路径
  let componentName = componentMap[path];
  
  // 如果没有直接匹配，尝试匹配带系统前缀的路径
  if (!componentName) {
    // 查找所有包含该路径的键
    const matchingKeys = Object.keys(componentMap).filter(key => key.endsWith(path));
    if (matchingKeys.length > 0) {
      // 如果有多个匹配，优先选择不带系统前缀的（如果有的话）
      const exactMatch = matchingKeys.find(key => key === path);
      componentName = componentMap[exactMatch || matchingKeys[0]];
    }
  }
  
  console.log(`路径 "${path}" 对应的组件名称: "${componentName}"`);
  return componentName || 'Empty';
}
